'''自制的flask后台应用统合脚本.

接收的网页端前台请求统一由本脚本转发到其他的应用,每一个应用写一个类文件.
appDict是启动的应用字典,一个名称对应一个App对象;
appnames用于渲染主网页,是应用名称的列表.
启动前一般只需要修改appDict的内容决定启动哪些App,还有就是在import那里把
不用的app注释掉,节省内存

接受3种格式的请求:

第一种是网页请求,作用为请求一个页面.只允许GET,对应的方法是
@app.route('/page/<appname>/', methods = ["GET"])
@app.route('/page/<appname>/<page>', methods = ["GET"])
def getPage(appname, page = '')
appname指定app的名称,对应公有变量appDict的一个key,若该app不存在,则返回
空结果.page是网页文件名,如果留空,则page=appname+'.html'

第二种是方法请求,作用是向后台询问一个方法是结果.只允许POST,对应的方法是
@app.route('/method/<appname>/<methodName>', methods = ["POST"])
def postMethod(appname, methodName)
methodName是一个字符串,告诉对应的app要查询的是哪个方法,参数则在request的
form中传达

第三种是线程监视请求,作用是询问后台的一个线程现在处于什么状态.只允许POST,
对应方法是:
@app.route('/thread/<appname>/<threadName>', methods = ["POST"])
def askThread(appname, threadName)
向app询问名字为threadName的线程的状态.关于线程状态{}的规定看
app/thread/BaseThread.py的注释描述
'''

import sys
import os

from flask import Flask, request, render_template

sys.path.append(os.path.join(sys.path[0], r'app'))
from TestApp1 import TestApp1
from m3u8FlaskDown import m3u8FlaskDown
from WebPicUpload import WebPicUpload
from WebPicView import WebPicView

### 这里设置打开的应用以及应用名称,在appDict设置. 
app = Flask(__name__)
appDict = {
  'TestApp1': TestApp1(),
  'm3u8FlaskDown': m3u8FlaskDown(),
  'WebPicUpload': WebPicUpload(),
  'WebPicView': WebPicView()
}
appnames = [appname for appname in appDict]

### 首页
@app.route('/', methods = ["GET"])
def homepage():
  return render_template('index.html', appnames = appnames)

### 获取页面,分发到各app类处理
@app.route('/page/<appname>/', methods = ["GET"])
@app.route('/page/<appname>/<page>', methods = ["GET"])
def getPage(appname, page = ''):
  if not (page):
    page = appname+'.html'
  print(r'MyFlaskApps - getPage({0}, {1})'.format(appname, page))
  if not (appname in appDict):
    print(r'{} is not appname!'.format(appname))
    return
  return appDict[appname].getPage(page, request)

### 获取异步请求,分发到各app类处理.返回应当是一个{}
@app.route('/method/<appname>/<methodName>', methods = ["POST"])
def postMethod(appname, methodName):
  print(r'MyFlaskApps - postMethod({0}, {1})'.format(appname, methodName))
  if not (appname in appDict):
    print(r'{} is not appname!'.format(appname))
    return
  return appDict[appname].postMethod(methodName, request)
  
### 连续访问,分发到各app类处理.返回应当是一个{}
@app.route('/thread/<appname>/<threadName>', methods = ["POST"])
def askThread(appname, threadName):
  print(r'MyFlaskApps - askThread({0}, {1})'.format(appname, threadName))
  if not (appname in appDict):
    print(r'{} is not appname!'.format(appname))
    return
  return appDict[appname].askThread(threadName)
  
### 开始脚本  
if __name__ == '__main__':
  app.run(port = 5001, debug = True)